package main

import "fmt"

/**
斐波那契数列;
	前两个数相加等于第三个数，第二三个数相加等于第四个数。。。。。
原理：
	主协程调用生产者方法，产生数字
	子协程抵用消费者方法，输出结果
	生产者方法里无限生成数字，直到接收到quit管道发送的消息为止
	消费者方法里接收指定次数的数字管道发来的消息，并打印，超出次数，发送quit消息，子协程执行完毕
	生产者方法接收到quit消息，直接return，生产者方法执行完毕，主协程执行完毕

具体执行方法：
	首先，主协程调用的生产者方法会先执行，这是子协程里会处于阻塞状态，因为他要等待生产者方法给他发送数据
	当生产者方法发送数据的时候，子协程里就会接收到发来的数据，并打印出来，这种操作会循环指定次数，超出次数
后，子协程发送退出消息，主协程接收到退出消息后，退出生产者函数，主协程执行完毕，程序退出
 */
func feibonaqi(chf chan <- int, quit <- chan bool)  {
	x, y := 1, 1
	for  {
		//监听channel数据的流动
		select {
		case chf <- x:
			x, y = y, x + y
		case flag := <- quit:
			fmt.Println(flag)
			return
		}
	}
}

func main()  {
	chf := make(chan int) //数字通信
	quit := make(chan bool)//程序是否结束

	//消费者，从channel中读取内容分
	go func() {
		for i := 0; i < 10; i++ {
			num := <- chf
			fmt.Println(num)
		}
		quit <- true
	}()

	//生产者，产生数字，写入channel
	feibonaqi(chf, quit)
}
